﻿/**
 * Proyecto: Cognitum
 * Global IT Services 2008
 * @author Mislas
 */
Cognitum.Cobranza.Liquidacion.Generales = Ext.extend(Karma.TFB, {
    initComponent: function(){
    Ext.apply(this, {
        
            column1items: [
            {
                xtype: 'datefield',
                fieldLabel: 'Fecha Liquidación',
                name: 'FechaLiquidacion',
                allowBlank: false
            },
            {
                fieldLabel: 'Liquidó',
                name: 'UsuarioLiquido',
                entityName: 'Usuario',
                xtype: 'entity.link'
            },            
            {
                fieldLabel: 'Aseguradora',
                name: 'Aseguradora',
                entityName: 'Aseguradoras',
                canAdd: false,
                xtype: 'entity.link'
            }, {
                fieldLabel: 'Moneda',
                name: 'Moneda',
                entityName: 'Monedas',
                canAdd: false,
                xtype: 'entity.link'
            }, {
                fieldLabel: 'Total cheques',
                xtype: 'numberfield',
                name: 'MontoCheque',
				enableKeyEvents: true,
                allowBlank: true,
				listeners: {
					keyup: {
						fn: this.calculaTotalValores,
						scope: this
					}
				}
            }, {
                fieldLabel: 'Total transferencias',
                xtype: 'numberfield',
                name: 'MontoTransferencia',
				enableKeyEvents: true,
                allowBlank: true,
				listeners: {
					keyup: {
						fn: this.calculaTotalValores,
						scope: this
					}
				}
            }, {
                fieldLabel: 'Total primas en deposito',
                xtype: 'numberfield',
                name: 'MontoPrimasEnDeposito',
				enableKeyEvents: true,
				disabled: false,
                allowBlank: true,
				listeners: {
					keyup: {
						fn: this.calculaTotalValores,
						scope: this
					}
				}
            }, {
                fieldLabel: 'Observaciones',
                name: 'Observaciones',               
                xtype: 'textarea',
                allowBlank: true                
            }],
            column2items: [{
                fieldLabel: 'Poliza',
                name: 'Poliza',
                entityName: 'Polizas',
                canAdd: false,
                allowBlank: true,
                xtype: 'entity.link',
				/*preContext: [{
                    value: 0,
                    query: 'p.FormaPago <= 2'
                }],*/
				contextTriggers: [{
                    id: 'Aseguradora',
                    query: 'p.Aseguradora.Id=?'
                }, {
                    id: 'Moneda',
                    query: 'p.Moneda.Id=?'
                }],
				listeners: {
					set: {
					    fn: function() {
						    var poliza = this.getForm().findField('Poliza').getEntityValue();						    
							this.getForm().findField('Grupo').disable();
							var recibosList = this.col3Panel.items.get(0);
							recibosList.setSelectContextSubQuery('(r.Estatus=0 and (r.Tramite.Id=' + poliza.Id + 
							' or r.Tramite.Id in (select en.Id from Endoso en where en.Poliza.Id= ' + poliza.Id + ') ) )');
							this.entity.useInvoker('GetEstadoCuentaPoliza', poliza.Id, {
		                        fn: function(estadoCuenta){
									this.setEstadoCuenta(estadoCuenta);
		                        },
		                        scope: this
		                    });
						},
						scope: this
					},
					cleared: {
						fn: function() {
							this.getForm().findField('Grupo').enable();
						},
						scope: this
					}
				}
            }, {
                fieldLabel: 'Grupo',
                name: 'Grupo',
                entityName: 'Grupos',
                allowBlank: true,
                canAdd: false,
                xtype: 'entity.link',
				listeners: {
					set: {
						fn: function() {
							var grupo = this.getForm().findField('Grupo').getEntityValue();
							this.getForm().findField('Poliza').disable();
							var recibosList = this.col3Panel.items.get(0);
							recibosList.setSelectContextSubQuery(
								' (r.Tramite.Id in (select t from PolizaGeneral t where t.Grupo.Id=' + grupo.Id + ') or ' + 
								'r.Tramite.Id in (select t from Endoso t where t.Poliza.Grupo.Id=' + grupo.Id + '))');
							this.entity.useInvoker('GetEstadoCuentaGrupo', grupo.Id, {
		                        fn: function(estadoCuenta){
		                            this.setEstadoCuenta(estadoCuenta);
		                        },
		                        scope: this
		                    });
						},
						scope: this
					},
					cleared: {
						fn: function() {
							this.getForm().findField('Poliza').enable();
						},
						scope: this
					}
				}
            }, {
                fieldLabel: 'Estado cuenta',
                xtype: 'numberfield',
                name: 'EstadoCuenta',
				labelStyle: 'font-weight:bold;',
                disabled: true,
                allowBlank: true
            }, {
                fieldLabel: 'Total Valores',
                xtype: 'numberfield',
                name: 'TotalValores',
				labelStyle: 'font-weight:bold;',
                disabled: true,
                allowBlank: true
            }, {
                fieldLabel: 'Total Recibos',
                xtype: 'numberfield',
                name: 'TotalRecibos',
				labelStyle: 'font-weight:bold;',
                disabled: true,
                allowBlank: true
            }, {
                fieldLabel: 'Diferencia',
                xtype: 'numberfield',
                name: 'DiferenciaPago',
                labelStyle: 'font-weight:bold;',
                disabled: true,
                allowBlank: true
            }, {
                fieldLabel: 'Total Comision',
                xtype: 'numberfield',
                name: 'TotalComision',
				labelStyle: 'font-weight:bold;',
                disabled: true,
                allowBlank: true
            }, {
                fieldLabel: 'Folio',                
                name: 'Folio',                
                allowBlank: true,
                readOnly: true
            }, {
                xtype: 'enum.combo',
                fieldLabel: 'Estatus liquidacion',
                name: 'Estatus',
                disabled: true,
                enumName: 'Cognitum.Dominio.Cobranza.EstatusLiquidacionEnum'
            }
            ],
            column3items: [{
                hideLabel: true,
                name: 'Recibos',
                entityName: 'Recibos',
                title: 'Recibos',
                xtype: 'entity.list',                
				selectionConfig: {
					multiSelect: true,
					width: 700
				},
				context: 'r.Liquidacion.Id=? ',
				/*selectContextQuery: 'r.Id in (select r1.Id from Recibo where r1.Tramite.Id = ?)',				*/
                anchor: '100% 100%',
				listeners: {
					'beforeadd': {
						fn: this.actualizaTotales,
						scope: this
					},
					'beforedelete': {
						fn: this.actualizaTotales,
						scope: this
		            },
		            'refresh': {
		                fn: this.actualizaTotales,
		                scope: this
		            }
				},
                updateControls: function(liquidacion){
                    if (Ext.isEmpty(liquidacion)) {
                        return;
                    }
                    // menu config
                    this.deleteMenuAction.setDisabled(!(this.canDelete && liquidacion.Estatus == 0));
                    this.newToolbarButton.setDisabled(!(this.canNew && liquidacion.Estatus == 0));
                },
                onBeforeAdd: function(ids, data, liquidacion){
                    if (Ext.isEmpty(liquidacion)) {
                        return;
                    }
					Ext.MessageBox.show({
					   msg: 'Procesando...',
					   progressText: 'Saving...',
					   width: 300,
					   wait: true,
					   waitConfig: { interval: 200 }
					});
                    this.entity.useInvoker('DoAsignaLiquidacion', [ids, liquidacion.Id], {
                        fn: function(){
                            this.reload();
							this.fireEvent('beforeadd');
							Ext.MessageBox.hide();
                        },
                        scope: this
                    });
                },
                onBeforeDelete: function(id){
                    if (Ext.isEmpty(id)) {
                        return;
                    }
					Ext.MessageBox.show({
					   msg: 'Procesando...',
					   progressText: 'Saving...',
					   width: 300,
					   wait: true,
					   waitConfig: { interval: 200 }
					});
                    this.entity.useInvoker('DoDesasignaLiquidacion', id, {
                        fn: function(){
                            this.reload();
							this.fireEvent('beforedelete');
							Ext.MessageBox.hide();
                        },
                        scope: this
                    });
                }
            }]
        });
        Cognitum.Cobranza.Liquidacion.Generales.superclass.initComponent.apply(this, arguments);
    },
	calculaTotalValores: function() {
		var montoCheque = this.getForm().findField('MontoCheque').getValue();
		var montoTrans = this.getForm().findField('MontoTransferencia').getValue();
		var montoPrimas = this.getForm().findField('MontoPrimasEnDeposito').getValue();
		var totalRecibos = this.getForm().findField('TotalRecibos').getValue();
		this.getForm().findField('TotalValores').setValue(
			montoCheque + montoTrans + montoPrimas);		
		this.getForm().findField('DiferenciaPago').setValue(
			montoCheque + montoTrans + montoPrimas - totalRecibos);

    },
	
    updateControls: function(value){
        if (Ext.isEmpty(value)) {
            return;
        }
        if (!this.isNew) {
            this.calculaTotalValores();
			this.getForm().findField('Aseguradora').disable();
			this.getForm().findField('Moneda').disable();
			this.getForm().findField('Poliza').disable();
			this.getForm().findField('Grupo').disable();
        }
    },
    
	setEstadoCuenta: function(estadoCuenta) {
		this.getForm().findField('EstadoCuenta').setValue(estadoCuenta.Saldo);
		if (estadoCuenta.Saldo > 0) {
			this.getForm().findField('MontoPrimasEnDeposito').enable();
		}
	},
	actualizaTotales:function() {
        if (Ext.isEmpty(this.getForm())) {
            return;
        }
		var id = this.getForm().findField('Id').getValue();
        this.entity.useInvoker(Karma.Conf.GetMethod, id, {
            fn: function(liquidacion){
                this.getForm().findField('TotalRecibos').setValue(liquidacion.TotalRecibos);
                this.getForm().findField('TotalComision').setValue(liquidacion.TotalComision);
            },
            scope: this
        });
	}
});
Ext.reg('liqu.ctls.gral', Cognitum.Cobranza.Liquidacion.Generales);

Cognitum.Cobranza.Liquidacion.Editor = Ext.extend(Karma.EBCard, {
    initComponent: function(){
        Ext.apply(this, {
            sections: [{
                title: 'Datos generales',
                xtype: 'liqu.ctls.gral'
            }, {
                xtype: 'sec.editor',
                title: 'Info Permisos'
            }, {
                xtype: 'aud.editor',
                title: 'Info Registro'
            }]
        });
        Cognitum.Cobranza.Liquidacion.Editor.superclass.initComponent.apply(this, arguments);
    },
	validateValue: function(value, operacion){
		if (operacion == 'save') {
			var poliza = this.getForm().findField('Poliza');
			var grupo = this.getForm().findField('Grupo');
			if(poliza.getValue() == null && grupo.getValue() == null) {
				poliza.markInvalid();
				grupo.markInvalid();
				Ext.Msg.alert('Error', 'Debe especificar poliza o grupo.');
				return false;
			}
		}
        return true;
    },
    getTBarCustomControls: function(){
        return [this.aplicarBtn = new Ext.Button({
            xtype: 'button',
            formBind: true,
            text: 'Aplicar',
            handler: this.onAplicar,
            scope: this
        }), this.cancelarBtn = new Ext.Button({
            xtype: 'button',
            formBind: true,
            text: 'Cancelar',
            handler: this.onCancelar,
            scope: this
        })];
    },
    updateControls: function(value){
        Cognitum.Cobranza.Liquidacion.Editor.superclass.updateControls.apply(this, arguments);
		this.guardarBtn.setDisabled((!value.Estatus == 0 || value.Estatus == 2));
        this.aplicarBtn.setDisabled(!this.puedeAplicar(value));
        this.cancelarBtn.setDisabled(!this.puedeCancelar(value));
    },
    puedeAplicar: function(value){
        if (!this.entity.security.has('Aplicar')) {
            return false;
        }
        return (!this.isNew) && value.Estatus == 0;
    },
    puedeCancelar: function(value){
        if (!this.entity.security.has('Cancelar')) {
            return false;
        }
        return (!this.isNew) && value.Estatus == 0;
    },
	onAplicar: function(){
		var totalValores = this.getForm().findField('TotalValores').getValue();
        var totalRecibos = this.getForm().findField('TotalRecibos').getValue();
		if (totalRecibos > totalValores) {
			Ext.Msg.show({
                title: 'Aviso',
                msg: 'El total de los recibos es mayor que el total de los valores. Deseas continuar (el faltante se aplicara de la comision)?',
                buttons: Ext.Msg.YESNO,
                closable: false,
                fn: function(result){
                    if (result === 'yes') {
	                    var liquidacion = this.getForm().getFieldValues();
	                    this.doOperationWithParams('DoAplica', liquidacion, {
	                        fn: function(liquidacion){
	                            this.status.setStatus({
	                                text: 'La liquidacion fue aplicada existosamente.',
	                                iconCls: 'ok-icon',
	                                clear: true
	                            });
	                            this.updateControls(liquidacion);
	                            Ext.MessageBox.alert('Exito', 'La operacion de Aplicacion se realizo con exito.');
	                        },
	                        scope: this
	                    });
                    }
                },
                animEl: this.getEl(),
                icon: Ext.MessageBox.QUESTION,
                scope: this
            });
			return false;
		} 
		else {
	        Ext.Msg.show({
	            title: 'Aplicacion',
	            msg: 'Esta apunto de realizar una Aplicacion',
	            buttons: Ext.Msg.YESNO,
	            fn: function(result){
	                if (result === 'yes') {
	                    var liquidacion = this.getForm().getFieldValues();
	                    this.doOperationWithParams('DoAplica', liquidacion, {
	                        fn: function(liquidacion){
	                            this.status.setStatus({
	                                text: 'La liquidacion fue aplicada existosamente.',
	                                iconCls: 'ok-icon',
	                                clear: true
	                            });
	                            this.updateControls(liquidacion);
	                            Ext.MessageBox.alert('Exito', 'La operacion de Aplicacion se realizo con exito.');
	                        },
	                        scope: this
	                    });
	                }
	            },
	            icon: Ext.MessageBox.QUESTION,
	            scope: this
	        });
		}
    },
	onCancelar: function(){
        Ext.Msg.show({
            title: 'Cancelación',
            msg: 'Esta apunto de realizar una Cancelación',
            buttons: Ext.Msg.YESNO,
            fn: function(result){
                if (result === 'yes') {
                    var liquidacion = this.getForm().getFieldValues();
                    this.doOperationWithParams('DoCancela', liquidacion, {
                        fn: function(liquidacion){
                            this.status.setStatus({
                                text: 'La liquidacion fue cancelada existosamente.',
                                iconCls: 'ok-icon',
                                clear: true
                            });
                            this.updateControls(liquidacion);
                            Ext.MessageBox.alert('Exito', 'La operacion de Cancelacion se realizo con exito.');
                        },
                        scope: this
                    });
                }
            },
            icon: Ext.MessageBox.QUESTION,
            scope: this
        });
    },

    getTBarDynamicControls: function(value) {
        if (value.Id > 0) {
            var cartaEntity = Karma.Core.ModuleManager.Instance.getEntity('Cartas');
            return [{
                fn: cartaEntity.getMenuLiquidacion,
                params: value.Id,
                scope: cartaEntity
            }];
        }
    }
});
Ext.reg('liq.editor', Cognitum.Cobranza.Liquidacion.Editor);
